package 线程andJUC.线程同步;

public class synchronized方法 {
    public static void main(String[] args) {
        MyTicket1 mt=new MyTicket1();
        Thread t0=new Thread(mt,"窗口1");
        Thread t1=new Thread(mt,"窗口1");
        Thread t2=new Thread(mt,"窗口1");
        t0.start();
        t1.start();
        t2.start();
    }
}
class MyTicket1 implements Runnable{
//      创建一个多线程共享的票源
  private static  int ticket=100;
//    设置线程任务：卖票
    @Override
    public void run() {
        System.out.println("this:"+this);//this:线程andJUC.线程同步.MyTicket1@e0b4573
//        使用死循环，让程序重复执行
        while (true){
            payTicketStatic();
        }
    }
    /*
    静态的同步方法
    锁对象不是this，this是创建对象之后产生的，静态方法优于对象
    静态方法的锁对象是本类的class属性-->class文件对象（反射）
     */
    public static void payTicketStatic(){
        synchronized (MyTicket1.class){
//            先判断票是否存在
            if (ticket>0){
//                提高安全问题出现的概率，让程序睡眠
                try {
                    Thread.sleep(10);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");
                ticket--;
            }
        }
    }
    /*
    定义一个同步方法，同步方法也会把方法内部的代码锁住
    只能让一个线程执行，同步方法的锁对象是实现类对象 new MyTicket1()
    也就是this
     */
    public void payTicket(){
        synchronized (this){
//            判断票是否存在
            if (ticket>0){
//                提高安全问题出现的概率，让程序睡眠
                try {
                    Thread.sleep(10);
                }catch (InterruptedException e){
                    e.printStackTrace();
                }

                System.out.println(Thread.currentThread().getName()+"在卖第"+ticket+"张票");
                ticket--;
            }
        }
    }
}
